home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / doc.lha / doc.doc / werkzeuge.doc < prev   
Text File  |  1992-09-25  |  47KB  |  1,253 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11. ___________________________________________________________________
  12.  
  13.  
  14.                                    Werkzeuge fuer den
  15.                                    Uebersetzerbau
  16.  
  17.                                    J. Grosch
  18.                                    H. Emmelmann
  19.  
  20. ___________________________________________________________________
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50. ___________________________________________________________________
  51.                                    GESELLSCHAFT FUeR MATHEMATIK
  52.                                    UND DATENVERARBEITUNG MBH
  53.  
  54.                                    FORSCHUNGSSTELLE FUeR
  55.                                    PROGRAMMSTRUKTUREN
  56.                                    AN DER UNIVERSITAeT KARLSRUHE
  57. ___________________________________________________________________
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.                                    Project
  76.  
  77.                              Compiler Generation
  78.  
  79.          ___________________________________________________________
  80.  
  81.                       Werkzeuge fuer den Uebersetzerbau
  82.  
  83.  
  84.                                  Josef Grosch
  85.                                Helmut Emmelmann
  86.  
  87.  
  88.                                  Feb. 7, 1990
  89.  
  90.          ___________________________________________________________
  91.  
  92.  
  93.                                 Report No. 21
  94.  
  95.  
  96.                              Copyright c 1990 GMD
  97.  
  98.  
  99.             Gesellschaft fuer Mathematik und Datenverarbeitung mbH
  100.                 Forschungsstelle an der Universitaet Karlsruhe
  101.                           Vincenz-Priesznitz-Str. 1
  102.                                D-7500 Karlsruhe
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.                                                                              1
  135.  
  136.  
  137.                       Werkzeuge fuer den Uebersetzerbau
  138.  
  139.                            J. Grosch, H. Emmelmann
  140.               GMD Forschungsstelle an der Universitaet Karlsruhe
  141.              Vincenz-Priesznitz-Str. 1, D-7500 Karlsruhe, Germany
  142.  
  143.  
  144. Uebersicht
  145.  
  146.      Mit Uebersetzerbau-Werkzeugen lassen sich Uebersetzer  fuer  Programmier-
  147. sprachen  weitgehend  automatisch generieren. Wir stellen einen Werkzeugkasten
  148. vor, welcher die Konstruktion nahezu aller Phasen  eines  Uebersetzers  unter-
  149. stuetzt.  Die  Entwurfsziele fuer diesen Werkzeugkasten waren praktische Brau-
  150. chbarkeit, deutlich reduzierter Erstellungsaufwand fuer Uebersetzer  und  hohe
  151. Qualitaet   der  generierten  Uebersetzer.  Besonders  hinsichtlich  Effizienz
  152. sollten die Werkzeuge konkurrenzfaehig zur Programmierung von Hand sein.   Zur
  153. Zeit  koennen  mit  den Werkzeugen Uebersetzermodule in den Zielsprachen C und
  154. Modula-2 erzeugt werden. Erste realistische Anwendungen demonstrieren die aus-
  155. gezeichnete  Leistungsfaehigkeit  der Werkzeuge und zeigen, dasz die Werkzeuge
  156. die Konstruktion von Uebersetzern mit Produktionsqualitaet erlauben.
  157.  
  158. 1.  Aufbau eines Uebersetzers
  159.  
  160.      Ein wichtiges Hilfsmittel zur  Programmierung  eines  Computers  ist  ein
  161. Uebersetzer  (compiler).   Ein  Uebersetzer  ist  ein Programm, welches ein in
  162. einer  Programmiersprache  geschriebenes  Programm  in  eine  Maschinensprache
  163. uebersetzt.  Die  Hardware  versteht  genaugenommen  nur aus Nullen und Einsen
  164. zusammengesetzte Maschinensprach-Programme. Um einem Computer auch  eine  fuer
  165. den  menschlichen  Programmierer  besser  geeignete hoehere Programmiersprache
  166. verstaendlich zu machen, ist eine Uebersetzung noetig.
  167.  
  168.      Die Konstruktion eines Uebersetzers ist eine anspruchsvolle  und  aufwen-
  169. dige  Aufgabe. Der Bedarf an Uebersetzern ist relativ grosz, da fuer jede Pro-
  170. grammiersprache und jeden Computer ein eigener Uebersetzer notwendig ist.   Es
  171. lohnt  sich  daher,  nach  Methoden  zu suchen die Erstellung von Compilern zu
  172. vereinfachen.  Doch bevor wir zu unserem eigentlichen Thema  kommen,  naemlich
  173. der  automatischen Generierung von Uebersetzern mit Uebersetzerbau-Werkzeugen,
  174. moechten wir kurz den Aufbau und die prinzipielle Funktionsweise eines  Ueber-
  175. setzers  erlaeutern.  Die rechte Spalte in Abb. 1 zeigt die Phasen bzw. Module
  176. eines Uebersetzers.
  177.  
  178.      Die lexikalische Analyse liest das Quellprogramm zeichenweise. Sie  faszt
  179. die  Zeichenfolgen  fuer Bezeichner, Zahlen und Schluesselwoerter zu Grundsym-
  180. bolen zusammen und ueberliest Zwischenraeume und Kommentare.
  181.  
  182.      Die syntaktische Analyse hat als Eingabe eine  Folge  von  Grundsymbolen.
  183. Sie  ueberprueft  das  Quellprogramm auf syntaktische Fehler und rekonstruiert
  184. die Struktur des Programms, d. h. sie erkennt den Aufbau  der  Ausdruecke  und
  185. Anweisungen  sowie  deren  Zusammenhang. Diese Struktur wird oft in Form eines
  186. Syntaxbaums gespeichert.
  187.  
  188.      Die semantische  Analyse  ueberprueft  die  Kontextbedingungen  bzw.  die
  189. Regeln  der statischen Semantik und berechnet fuer die Codegenerierung noetige
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.                                                                              2
  201.  
  202.  
  203. Eigenschaften. Ein Beispiel fuer eine  Kontextbedingung  ist  die  Vorschrift,
  204. dasz  alle Variablen deklariert sein muessen.  Zur statischen Semantik zaehlen
  205. die Analyse der Gueltigkeitsbereiche, die Namensanalyse, d.  h. die  Feststel-
  206. lung  der  zu  einem  Bezeichner  gehoerenden  Deklaration,  und die Typueber-
  207. pruefung.
  208.  
  209.      Zur Vereinfachung der gesamten Uebersetzungsaufgabe wird diese haeufig in
  210. zwei  Schritte unterteilt. Der Syntaxbaum wird zunaechst von einer Transforma-
  211. tionsphase in eine  Zwischensprache  umgewandelt.  Diese  Zwischensprache  ist
  212. meist  maschinenorientiert  jedoch  noch  maschinenunabhaengig.  Das  niedrige
  213. Niveau der Zwischensprache erleichtert dem  Codegenerator  die  Erzeugung  der
  214. Maschinensprache.
  215.  
  216.      Zu den Aufgaben des Codegenerators zaehlen die Befehlsauswahl, d. h.  die
  217. Abbildung   der  Zwischensprachanweisungen  auf  Maschinenbefehle,  sowie  die
  218. Speicher- und Registerzuteilung.  Die Ausgabe  ist  schlieszlich  ein  binaer-
  219. codiertes Maschinenprogramm.
  220.  
  221.      Der folgende Abschnitt beschreibt die Vorteile, die Entwurfsziele und den
  222. Inhalt  des Werkzeugkastens.  Abschnitt 3 stellt die gemeinsamen Eigenschaften
  223. der Werkzeuge dar.  Im Abschnitt 4 wird das von uns bevorzugte  Uebersetzermo-
  224. dell beschrieben.  Der Abschnitt 5 enthaelt eine kurze Darstellung der einzel-
  225. nen Werkzeuge.  Abschnitt 6 berichtet von den Erfahrungen  des  Einsatzes  der
  226. Werkzeuge in zwei realistischen Anwendungen.  Abschnitt 7 enthaelt eine Zusam-
  227. menfassung und beschreibt weiterfuehrende Arbeiten.
  228.  
  229. 2.  Werkzeugkasten
  230.  
  231.      Die Erstellung eines Uebersetzers von Hand ist eine  sehr  anspruchsvolle
  232. und  aufwendige  Aufgabe.   Durch  den  Einsatz  von Uebersetzerbau-Werkzeugen
  233. laeszt sich  dieser  Aufwand  reduzieren.   Im  folgenden  stellen  wir  einen
  234. Werkzeugkasten  zur  Uebersetzer-Generierung  vor,  welcher  fuer  nahezu jede
  235. Uebersetzerphase Werkzeuge enthaelt.  Diese sind fuer den Einsatz  in  realis-
  236. tischen Uebersetzerprojekten konzipiert.
  237.  
  238.      Im allgemeinen akzeptieren die Werkzeuge als Eingabe eine  Spezifikation,
  239. die  in  einer  werkzeug-spezifischen Sprache geschrieben ist. Sie produzieren
  240. als Ausgabe ein Programm-Modul in einer Zielsprache (C oder Modula-2). Deshalb
  241. kann  ein  Werkzeug  als generische Loesung eines Teilproblems in einem Ueber-
  242. setzer gesehen werden, wobei  mit  Hilfe  einer  Spezifikation  eine  konkrete
  243. Loesung gewonnen wird.
  244.  
  245.      Die Benutzung von Werkzeugen hat gegenueber der Programmierung  von  Hand
  246. mehrere  Vorteile:  Der zur Konstruktion eines Uebersetzers notwendige Aufwand
  247. wird wesentlich verringert. An Stelle eines Programms wird eine viel  kuerzere
  248. Spezifikation  entwickelt.  Die  Werkzeuge koennen eine Spezifikation in viel-
  249. facher Weise auf Konsistenz ueberpruefen. Das Schreiben automatisch pruefbarer
  250. Spezifikationen  verringert  die  Anzahl  moeglicher Fehler und erhoeht so die
  251. Zuverlaessigkeit des resultierenden Uebersetzers.
  252.  
  253.      Die wichtigsten Entwurfsziele fuer den Werkzeugkasten waren:
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.                                                                              3
  266.  
  267.  
  268. -    praktische Brauchbarkeit fuer realistische Programmiersprachen
  269.  
  270. -    automatische Generierung von Uebersetzern mit Produktionsqualitaet
  271.  
  272. -    wesentliche Steigerung der Uebersetzerbau-Produktivitaet
  273.  
  274. -    mit Handprogrammierung vergleichbare Qualitaet der erzeugten Uebersetzer
  275.  
  276.      Mit dieser  Zielsetzung   sollte  die  praktische  Einsatzfaehigkeit  des
  277. Werkzeugkastens  in  realistischen  Uebersetzerbauprojekten  erreicht  werden.
  278. Daher wurde auch die Konkurrenzfaehigkeit zur Handprogrammierung  betont.  Wir
  279. meinen,  dasz  die  hohe  Produktivitaet und Zuverlaessigkeit nicht durch eine
  280. geringere Codequalitaet oder Effizienz des  resultierenden  Compilers  erkauft
  281. werden musz.
  282.  
  283.      Der Werkzeugkasten enthaelt folgende Werkzeuge:
  284.  
  285.     Rex     Generator fuer lexikalische Analysatoren
  286.     Lalr    LALR(1) Zerteilergenerator
  287.     Ell     LL(1) Zerteilergenerator
  288.     Ast     Generator fuer abstrakte Syntaxbaeume
  289.     Ag      Generator fuer Attributauswerter
  290.     Estra   Transformation abstrakter Syntaxbaeume
  291.     Beg     Generator fuer Codegeneratoren
  292.     Reuse   Bibliothek wiederverwendbarer Module
  293.  
  294.  
  295.      Alle Werkzeuge wurden urspruenglich in Modula-2 programmiert  und  laufen
  296. unter  dem  Betriebssystem  UNIX.  Unter Verwendung des Modula-2 nach C Ueber-
  297. setzers Mtc [Mar90] (siehe Abschnitt 6.1), konnte von den  Programmen  automa-
  298. tisch  eine C-Version erstellt werden. Zur Zeit erzeugen die meisten Werkzeuge
  299. Module in den Zielsprachen C und Modula-2.
  300.  
  301. 3.  Gemeinsame Eigenschaften
  302.  
  303.      Unsere Entwurfsziele fuehrten zu einigen fuer alle Werkzeuge  gemeinsamen
  304. Entwurfsentscheidungen.  Nahezu  jedes  Werkzeug  benoetigt  eine Programmier-
  305. sprache, mit der der Benutzer gewisze Aktionen, Bedingungen oder  Berechnungen
  306. spezifizieren  kann.  Das  trifft  offensichtlich fuer Attributgrammatiken zu,
  307. aber auch der Codegenerator-Generator musz Attribute und  Bedingungen  auswer-
  308. ten.  Sogar die Zerteilergeneratoren brauchen eine solche Sprache zur Spezifi-
  309. kation semantischer Aktionen.
  310.  
  311.      Wir entschieden uns  dafuer  direkt  die  Zielsprache  (naemlich  C  oder
  312. Modula-2)  zu verwenden.  Deshalb koennen Spezifikationen Abschnitte mit Ziel-
  313. sprachanweisungen enthalten. Abgesehen  von  geringfuegigen  Ersetzungen  wird
  314. dieser Text unveraendert in die erzeugten Module kopiert.  Der Nachteil dieser
  315. Methode ist, dasz die in der Zielsprache geschriebenen Teile nicht  vollstaen-
  316. dig  von  den  Werkzeugen  ueberprueft  werden  koennen. Zum Beispiel kann das
  317. Attributgrammatik-Werkzeug nicht ueberpruefen, ob  Attributberechnungen  keine
  318. Seiteneffekte  haben.  Andererseits  wird damit eine sehr grosze Flexibilitaet
  319. erreicht, da die volle Ausdruckskraft der Zielsprache  zur  Verfuegung  steht.
  320. Ebenso   wird   die   praktische   Brauchbarkeit  drastisch  erhoeht,  da  die
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.                                                                              4
  332.  
  333.  
  334. Einbeziehung anderer, eventuell handgeschriebener Komponenten leicht  moeglich
  335. ist.  Schlieszlich  fuehrt es zu einfachen Werkzeugen und einfachen Spezifika-
  336. tionssprachen.
  337.  
  338.      Unsere Erfahrung mit frueheren Werkzeugen zeigte, dasz waehrend der  Kon-
  339. struktion realistische Uebersetzer eine Reihe kleiner Sonderprobleme auftritt,
  340. die nicht mit den Werkzeugen geloest werden  koennen.  Deswegen  sind  Schlup-
  341. floecher  noetig,  also  Moeglichkeiten,  die es dem Werkzeugbenutzer erlauben
  342. leicht handgeschriebene Teile einzufuegen. Diese  Schlupfloecher  tragen  auch
  343. dazu  bei  die  Werkzeuge  einfach zu machen, da man nicht gezwungen ist, fuer
  344. jedes Problem  sofort  eine  Loesung  bereitzustellen.  Das  Schlupfloch  kann
  345. benutzt  werden  solange  bis eine wirklich gute Loesung gefunden wird, welche
  346. man in ein Werkzeug einbauen kann.
  347.  
  348.      Die Werkzeuge sind groesztenteils von  einander  unabhaengig.  Dies  wird
  349. dadurch  erzielt,  dasz  keines  der erzeugten Module eine festgelegte Ausgabe
  350. besitzt. Stattdessen wird diese Ausgabe mittels  Anweisungen  der  Zielsprache
  351. spezifiziert  und kann somit beliebig gewaehlt werden. Die Unabhaengigkeit der
  352. Werkzeuge sorgt fuer grosze Freiheiten beim Uebersetzerentwurf. Eine  Ausnahme
  353. bilden  die  Werkzeuge  Ag und Estra, denn sie basieren auf den mit Ast spezi-
  354. fizierten Syntaxbaeumen. Deshalb haengen diese Werkzeuge von Ast ab, und  alle
  355. drei  Werkzeuge  sind fuer Uebersetzer zugeschnitten, die einen attributierten
  356. abstrakten Syntaxbaum benutzen.
  357.  
  358. 4.  Uebersetzer-Modell
  359.  
  360.      Obwohl die Werkzeuge kein bestimmtes Uebersetzer-Modell  erzwingen,  moe-
  361. chten wir das von uns bevorzugte Modell vorstellen. Wir meinen, dasz dieses am
  362. besten von den Werkzeugen unterstuetzt wird. Wir  betrachten  die  semantische
  363. Analyse  nach  wie  vor als den schwierigsten Teil eines Uebersetzers. Deshalb
  364. gehen wir fuer die semantische Analyse und die Erzeugung einer Zwischensprache
  365. von  der  abstrakten  Syntax aus. Wir bauen den abstrakten Syntaxbaum explizit
  366. auf, welcher  waehrend  der  semantischen  Analyse  eventuell  mit  Attributen
  367. ergaenzt  wird.  Neben der abstrakten Syntax, welche als erste, hohe Zwischen-
  368. sprache betrachtet werden kann, bevorzugen wir die Verwendung  einer  zweiten,
  369. niederen Zwischensprache als Schnittstelle zum Codegenerator. Dies bringt Vor-
  370. teile in der Optimierung und der mustergesteuerten Codeauswahl mit sich.
  371.  
  372.      Abbildung 1 zeigt das von uns bevorzugte  Uebersetzermodell.  Die  rechte
  373. Spalte  enthaelt  die  wichtigsten Module eines Uebersetzers. Die linke Spalte
  374. zeigt die dazu notwendigen Spezifikationen. Die dazwischen liegenden Werkzeuge
  375. werden  von  den  Spezifikationen gesteuert und erzeugen die einzelnen Module.
  376. Die Pfeile stellen den Datenflusz dar, teils zur  Generierungszeit  und  teils
  377. zur Uebersetzungszeit.
  378.  
  379. 5.  Die Werkzeuge
  380.  
  381.      Die  folgenden  Abschnitte  stellen  kurz  die  einzelnen  Werkzeuge  des
  382. Werkzeugkastens vor. Wir beschreiben nur die Eigenschaften der Werkzeuge. Fuer
  383.  
  384.                           Abb. 1: Uebersetzer-Modell
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.                                                                              5
  397.  
  398.  
  399. weitere Einzelheiten, die Spezifikationstechniken oder fuer Beispiele sei  der
  400. Leser auf die existierenden, werkzeug-spezifischen Dokumente verwiesen.
  401.  
  402. 5.1.  Rex
  403.  
  404.      Rex  (regular  expression  tool)  ist  ein  Generator  fuer  lexikalische
  405. Analysatoren  [Gro87a,  Gro88,  Gro89a].   Seine  Spezifikationen basieren auf
  406. regulaeren Ausdruecken und beliebigen semantischen Aktionen, die in einer  der
  407. Zielsprachen  C  oder  Modula-2 geschrieben werden.  Immer wenn in der Eingabe
  408. des  erzeugten  lexikalischen  Analysators  eine  einem  regulaeren   Ausdruck
  409. entsprechende  Zeichenkette  erkannt  wurde,  werden die zugehoerigem Aktionen
  410. ausgefuehrt. Falls zur eindeutigen Erkennung der Symbole  der  Kontext  betra-
  411. chtet  werden musz, so kann der rechte Kontext durch einen zusaetzlichen regu-
  412. laeren  Ausdruck  spezifiziert  werden,  und  der  linke  Kontext   wird   mit
  413. sogenannten  Start-Zustaenden  behandelt.   Falls mehrere regulaere Ausdruecke
  414. auf die aktuelle Eingabe zutreffen, so wird der  Ausdruck  mit  der  laengsten
  415. Zeichenkette  bevorzugt.  Falls  es immer noch mehrere Moeglichkeiten gibt, so
  416. wird der zuerst in der Spezifikation stehende Ausdruck gewaehlt.
  417.  
  418.      Die erzeugten lexikalischen Analysatoren berechnen automatisch Zeile  und
  419. Spalte  in  der  Quelle fuer jedes erkannte Symbol und enthalten einen Mechan-
  420. ismus  fuer  Include-Dateien.   Bezeichner   und   Schluesselwoerter   koennen
  421. effizient  in  Grosz- oder Kleinbuchstaben normalisiert werden. Es gibt vorde-
  422. finierte Regeln um Leerstellen, Tabulatoren und Zeilenwechsel  zu  ueberlesen.
  423. Die  generierten lexikalischen Analysatoren sind tabellengesteuerte, determin-
  424. istische endliche Automaten. Die Tabellen werden mit der sogenannten  Kammvek-
  425. tortechnik komprimiert [ASU86].
  426.  
  427.      Die herausragende Eigenschaft von Rex  ist  seine  Geschwindigkeit.   Die
  428. lexikalischen  Analysatoren  verarbeiten nahezu 200.000 Zeilen pro Minute ohne
  429. Hashing von Bezeichnern und 150.000 Zeilen pro Minute mit  Hashing.  Dies  ist
  430. die  vierfache Geschwindigkeit gegenueber mit Lex [Les75] generierten lexikal-
  431. ischen Analysatoren. In typischen Faellen besitzen mit Rex generierte Analysa-
  432. toren  ein  Viertel der Groesze derer von Lex. Normalerweise benoetigt Rex nur
  433. 1/10 der Zeit von Lex zum Generieren eines lexikalischen Analysators.
  434.  
  435. 5.2.  Lalr
  436.  
  437.      Lalr  ist  ein  LALR(1)  Zerteiler-Generator  der  Grammatiken,  die   in
  438. erweiterter  BNF  geschrieben  sind,  verarbeitet [GrV88, Gro88].  Die Gramma-
  439. tikregeln koennen mit semantischen Aktionen versehen  werden,  die  direkt  in
  440. einer  Zielsprache  formuliert  sind.   Immer wenn der erzeugte Zerteiler eine
  441. Grammatikregel erkennt, wird die zugehoerige semantische  Aktion  ausgefuehrt.
  442. Der Generator stellt einen Mechanismus zur S-Attributierung zur Verfuegung, d.
  443. h. synthetisierte Attribute koennen waehrend der Zerteilung berechnet werden.
  444.  
  445.      Im Falle von LR-Konflikten liefert Lalr nicht wie andere Generatoren  nur
  446. Information  ueber  aus  Mengen  von Situationen bestehende Zustaende, sondern
  447. druckt einen Ableitungsbaum, der wesentlich nuetzlicher zur Analyse  des  Kon-
  448. flikts ist. Konflikte koennen durch die Angabe von Prioritaet und Assoziativi-
  449. taet fuer Operatoren und Produktionen geloest  werden.  Die  generierten  Zer-
  450. teiler  beinhalten  eine automatische Fehlerbehandlung mit Fehlermeldungen und
  451. -reparatur.  Zur Fehlerbehandlung wird die  vollstaendige,  ruecksetzungsfreie
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.                                                                              6
  463.  
  464.  
  465. Methode  von  Roehrich  [Roeh76, Roeh80, Roeh82] verwendet. Die Zerteiler sind
  466. tabellengesteuert und wie im  Falle  von  Rex  werden  die  Tabellen  mit  der
  467. Kammvektortechnik   komprimiert.   Der  Generator  verwendet  den  in  [DeP82]
  468. beschriebenen Algorithmus zur Berechnung der Vorschaumengen.
  469.  
  470.      Mit Lalr erzeugte Zerteiler sind zwei bis drei mal schneller als mit Yacc
  471. [Joh75]  erzeugte.  Sie  erreichen eine Geschwindigkeit von 580.000 Zeilen pro
  472. Minute ohne Beruecksichtigung der lexikalischen Analyse. Die Groesze der  Zer-
  473. teiler  ist gegenueber Yacc leicht erhoeht, denn fuer die Geschwindigkeit musz
  474. ein kleiner Preis bezahlt werden.
  475.  
  476.      Die Eingabesprachen  von  Rex  und  Lalr  sind  hinsichtlich  der  Syntax
  477. gegenueber  Lex  und  Yacc  lesbarer  gestaltet.  Mit Hilfe zweier, hier nicht
  478. naeher beschriebener Praeprozessoren koennen Rex und Lalr auch  Eingaben  fuer
  479. Lex  und  Yacc  verarbeiten.  Dadurch  sind  unsere Werkzeuge in Bezug auf die
  480. Benutzerschnittstelle kompatibel mit den UNIX-Werkzeugen.
  481.  
  482. 5.3.  Ell
  483.  
  484.      Ell  ist  ein  LL(1)  Zerteiler-Generator,  der  die  gleiche  Spezifika-
  485. tionssprache  wie  Lalr verarbeitet, mit dem Unterschied, dasz die Grammatiken
  486. die LL(1)-Eigenschaft besitzen muessen [GrV88, Gro88, Gro89b].   Waehrend  der
  487. Zerteilung  kann  eine L-Attributierung ausgewertet werden. Die erzeugten Zer-
  488. teiler beinhalten eine automatische Fehlerbehandlung mit  Fehlermeldungen  und
  489. -reparatur  wie  Lalr.  Die  Zerteiler  sind nach dem Verfahren des rekursiven
  490. Abstiegs implementiert und erzielen eine Geschwindigkeit  von  900.000  Zeilen
  491. pro Minute.
  492.  
  493. 5.4.  Ast
  494.  
  495.      Ast ist ein Generator fuer abtrakte Syntaxbaeume  [Gro89d,  Gro89e].   Er
  496. generiert  Programm-Module  oder abstrakte Datentypen zur Bearbeitung attribu-
  497. tierter Baeume. Neben Baeumen koennen auch  attributierte  Graphen  bearbeitet
  498. werden. Den Knoten dieser Datenstrukturen koennen beliebig viele Attribute von
  499. beliebigem Typ zugeordnet werden. Die  Spezifikationen  fuer  dieses  Werkzeug
  500. basieren  auf  erweiterten Baum-Grammatiken.  Sie koennen als gemeinsame Nota-
  501. tion sowohl fuer konkrete und abstrakte Syntax  als  auch  fuer  attributierte
  502. Baeume  und Graphen betrachtet werden. Ein Erweiterungsmechanismus stellt ein-
  503. fache Vererbung zur Verfuegung. Intern werden  die  Baeume  durch  verzeigerte
  504. Verbunde  gespeichert.  Zahlreiche Operationen fuer Baeume und Graphen koennen
  505. auf Anforderung von Ast erzeugt werden:  Sogenannte  Knotenkonstruktoren  kom-
  506. binieren    Aggregatschreibweise    mit    Speicherverwaltung.    Lese-    und
  507. Schreibeprozeduren uebertragen Graphen aus/in Dateien in lesbarem ASCII-  oder
  508. internem  Binaerformat.  Die  Reihenfolge  von Teilbaeumen in einer Liste kann
  509. umgekehrt  werden.  Es  werden  Prozeduren  fuer  haeufig   benutzte   Traver-
  510. sierungsstrategien  wie  top  down oder bottom up zur Verfuegung gestellt. Ein
  511. interaktiver Graph-Browser erlaubt die  Inspektion  von  Graphen  in  lesbarer
  512. Weise und unterstuetzt so den Programmtest.
  513.  
  514. 5.5.  Ag
  515.  
  516.      Ag ist ein Generator fuer Attributauswerter [Gro89c,  Gro90].  Er  verar-
  517. beitet  geordnete  Attributgrammatiken  (OAGs)  [Kas80]  und sogenannte higher
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.                                                                              7
  529.  
  530.  
  531. order Attributgrammatiken (HAGs) [VSK89].  Er basiert auf der abstrakten  Syn-
  532. tax  oder besser gesagt auf den von Ast erzeugten Baummodulen. Deshalb ist die
  533. Baumstruktur voellig  bekannt.  Den  Terminalen  und  Nichtterminalen  koennen
  534. beliebig  viele  Attribute  zugeordnet  werden. Diese werden mit den Typen der
  535. Zielsprache getypt.  Dabei  sind  auch  baumwertige  Attribute  moeglich.   Ag
  536. erlaubt  regellokale  Attribute  und  bietet einen Erweiterungsmechanismus an,
  537. welcher einfache Vererbung fuer Attribute und  Attributberechnungen  zur  Ver-
  538. fuegung  stellt.  Dieser gestattet ebenfalls die Elimination von Kettenregeln.
  539. Die Attributberechnungen werden in der Zielsprache formuliert und  sollten  in
  540. einem  funktionalen Stil gehalten sein. Es ist moeglich externe Funktionen von
  541. getrennt uebersetzten Modulen aufzurufen.  Die  Verwendung  nicht-funktionaler
  542. Anweisungen und von Seiteneffekten ist moeglich, verlangt allerdings sorgfael-
  543. tige Ueberlegung. Die Syntax der Spezifikationssprache ist im Hinblick auf die
  544. Unterstuetzung  kompakter,  modularer und lesbarer Dokumente entworfen worden.
  545. Eine Attributgrammatik kann aus mehreren  Modulen  bestehen,  wobei  die  kon-
  546. textfreie  Grammatik  nur einmal spezifiziert wird.  Es gibt Kurzschreibweisen
  547. fuer Kopierregeln and gefaedelte  Attribute  womit  viele  triviale  Attribut-
  548. Berechnungen weggelassen werden koennen.  Die erzeugten Attributauswerter sind
  549. sehr effizient, da sie unter Verwendung von rekursiven Prozeduren direkt codi-
  550. ert  sind.   Die  Speicherung der Attribute wird optimiert indem Attribute als
  551. lokale  Variable  und  Prozedurparameter  implementiert  werden,   wenn   ihre
  552. Lebenszeit innerhalb eines Besuches liegt.
  553.  
  554. 5.6.  Estra
  555.  
  556.      Estra ist ein Generator fuer Transformatoren von abstrakten Syntaxbaeumen
  557. [Vie89].   Die erzeugten Transformations-Module haben als Eingabe einen attri-
  558. butierten Baum und bilden diesen auf eine Ausgabe beliebiger Art ab. Die  Aus-
  559. gabe  kann ein neuer Baum sein, eine lineare Zwischensprache wie z. B. P-Code,
  560. ein Quellprogramm z. B. in Pascal oder eine  Folge  von  Prozeduraufrufen.  In
  561. jedem  Fall bleibt der Eingabebaum unveraendert, um das Problem der Reattribu-
  562. tierung aus Konsistenzgruenden  zu  umgehen.  Jedoch  koennen  Teilbaeume  des
  563. Eingabebaums  zur  Konstruktion eines Ausgabebaums wiederverwendet werden. Die
  564. beabsichtigten Anwendungsgebiete fuer die Transformationen sind die  Erzeugung
  565. von  Zwischensprachen aus abstrakten Syntaxbaeumen und Optimierer fuer interne
  566. Baumstrukturen jeden Niveaus.  Estra arbeitet mit dem Werkzeug Ast zusammen in
  567. der  Art,  dasz  die  Eingabebaeume mittels von Ast erzeugten Modulen erstellt
  568. werden.
  569.  
  570.      Die Spezifikation  einer  Transformation  ist  regelbasiert.  Eine  Regel
  571. besteht  aus  einem  Muster,  welches  ein  Baumfragment beschreibt, und einer
  572. Aktion. Aktionen bestehen aus Anweisungen der Zielsprache. Es koennen  mehrere
  573. Transformationen  spezifiziert werden. Die Teilbaeume eines Musters koennen in
  574. beliebiger Reihenfolge transformiert werden. Sie koennen mehrmals mit der sel-
  575. ben  oder  mit  verschiedenen Transformationen bearbeitet werden. Die Aktionen
  576. haben Lesezugriff auf die Attribute des Eingabebaums. Zusaetzliche abgeleitete
  577. oder  vererbte Attribute koennen waehrend der Transformation berechnet werden.
  578. Die Anwendung von Regeln laeszt sich durch Bedingungen einschraenken. Mehrdeu-
  579. tigkeiten werden mittels Kostenangaben aufgeloest.
  580.  
  581.      Zwei Implementierungen fuer den Algorithmus zum  Mustervergleich  koennen
  582. gewaehlt  werden: Ein direkt codierter dynamischer Programmierungs-Algorithmus
  583. oder  ein  tabellen-gesteuerter  Baummuster-Vergleicher.  In  beiden   Faellen
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.                                                                              8
  595.  
  596.  
  597. besitzt  eine Transformation zwei Phasen. Waehrend die Erste die mit minimalen
  598. Kosten passenden Muster bestimmt, fuehrt die Zweite die zugehoerigen  Aktionen
  599. aus.
  600.  
  601. 5.7.  Beg
  602.  
  603.      Beg (back end generator) erzeugt Module zur Codeauswahl und zur Register-
  604. zuteilung  [Emm89a,  Emm89b].   Codeauswahl  wird mittels Baummuster-Vergleich
  605. durchgefuehrt. Die Maschinenbefehle werden mit Regeln beschrieben welche Baum-
  606. muster enthalten. Der erzeugte Codegenerator hat als Eingabe eine baumfoermige
  607. Zwischensprache. Ein Eingabebaum wird abgebildet durch  die  Ueberdeckung  des
  608. Baums  mit Mustern und der anschlieszenden Ausgabe der zugehoerigen Maschinen-
  609. befehle. Die Regeln sind mit Kosten versehen, wodurch der  Codegenerator  eine
  610. Ueberdeckung mit Regeln mit minimalen Kosten auswaehlen kann.
  611.  
  612.      Der Benutzer beschreibt auf  eventuell  mehrdeutige  Art  und  Weise  die
  613. Abbildung  bestimmter Konstrukte der Zwischensprache. Er braucht keinen Algor-
  614. ithmus zu programmieren, der die beste Abbildung eines Eingabebaums auswaehlt.
  615. Es  ist  guenstig  bei  der  Entwicklung einer Codegenerator-Beschreibung erst
  616. einen Teil der Maschinenbefehle zu spezifizieren, der grosz genug ist, um  die
  617. ganze  Sprache  zu  uebersetzen. Dies fuehrt zu einem funktionsfaehigen Ueber-
  618. setzer, welcher eventuell ineffizienten Code erzeugt. Spaeter koennen nach und
  619. nach weitere Regeln hinzugefuegt werden, was schlieszlich zu einem Uebersetzer
  620. fuehrt, der guten Code erzeugt.
  621.  
  622.      Beg implementiert die Bestimmung einer Ueberdeckung mit minimalen  Kosten
  623. unter    Verwendung   einer   direkt   codierten   Version   des   dynamischen
  624. Programmierungs-Algorithmus [Emm88, ESL89].
  625.  
  626.      Die Generierung eines Registerzuteilers ist von besonderer Bedeutung,  da
  627. hier Handprogrammierung ziemlich schwer und laestig ist und weil Fehler in der
  628. Registerzuteilung manchmal schwer zu finden sind. Innerhalb der Regeln koennen
  629. die  Eigenschaften  eines  Maschinenbefehls hinsichtlich der Registerzuteilung
  630. spezifiziert werden: die erlaubten Register fuer jeden  Operanden,  die  durch
  631. Seiteneffekte  veraenderten  Register und ob es sich um einen Zweiadreszbefehl
  632. handelt  oder  nicht.  Zusaetzlich  wird  der  Registersatz  der  Zielmaschine
  633. beschrieben.  Sogar  das  Doppelregister-Problem  (wie z. B. auf IBM 370) kann
  634. behandelt werden.
  635.  
  636.      Zwei Arten von Registerzuteilung sind moeglich: Die on the fly  Register-
  637. zuteilung  kann  nur  einfache  Registersaetze  behandeln. Sie ist jedoch sehr
  638. effizient und liefert fuer viele Maschinen  zufriedenstellende  Ergebisse.  In
  639. manchen  Faellen  ist der allgemeine Registerzuteiler noetig, welcher eine Art
  640. von Vorschau durchfuehrt und deshalb einen zusaetzlichen Pasz benoetigt.
  641.  
  642. 5.8.  Reuse
  643.  
  644.      Reuse ist eine Bibliothek wiederverwendbarer Module  hauptsaechlich  fuer
  645. den  Einsatz  im  Uebersetzerbau  [Gro87b]. Sie enthaelt Module oder abstrakte
  646. Datentypen, die fast in jedem Uebersetzer gebraucht werden:
  647.  
  648. -    eine dynamische Speicherverwaltung
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.                                                                              9
  660.  
  661.  
  662. -    ein Modul fuer dynamische und flexible Felder
  663.  
  664. -    ein Modul zur Speicherung variabel langer Zeichenketten
  665.  
  666. -    ein Modul zur Zeichenkettenbearbeitung
  667.  
  668. -    eine Bezeichnertabelle, welche Zeichenketten unter Verwendung eines Hash-
  669.      verfahrens eindeutig auf ganze Zahlen abbildet
  670.  
  671. -    Module fuer oft verwendete Datenstrukturen wie Mengen von  ganzen  Zahlen
  672.      oder  binaere  Relationen  zwischen  ganzen Zahlen ohne Beschraenkung des
  673.      Definitionsbereichs.
  674.  
  675. 6.  Erfahrungen
  676.  
  677.      Dieser Abschnitt  berichtet  ueber  die  Erfahrungen  des  Einsatzes  des
  678. Werkzeugkastens fuer zwei realistische Anwendungen.
  679.  
  680. 6.1.  Modula nach C Uebersetzer
  681.  
  682.      Die bisher groeszte Anwendung des  Werkzeugkastens  war  die  Generierung
  683. eines  Modula-2  nach C Uebersetzers [Mar90]. Das Mtc genannte Programm ueber-
  684. setzt Modula-2  Programme  in  lesbaren  C  Code  ohne  Einschraenkung  (sogar
  685. geschachtelte  Prozeduren und Module). Es ist weitgehend automatisch generiert
  686. und folgt dem in  Abschnitt  4  vorgeschlagenen  Uebersetzer-Modell.  Anstelle
  687. einer Zwischensprache erzeugt Mtc C Code und benoetigt deshalb keinen Codegen-
  688. erator zur Ausgabe von Maschinencode. Es enthaelt so viel von der semantischen
  689. Analyse wie fuer die Aufgabe gebraucht wird. Die semantische Analyse ist ziem-
  690. lich vollstaendig und enthaelt die Behandlung der Gueltigkeitsbereiche, Namen-
  691. sanalyse und Typbestimmung. Es fehlt die Ueberpruefung von Kontextbedingungen,
  692. da davon ausgegangen wird, dasz  nur  korrekte  Programme  uebersetzt  werden.
  693. Tabelle  1  enthaelt  die  Groeszen  der  Spezifikationen  und der generierten
  694. Quell-Module. Der Entwurf und die Implementierung von  Mtc  wurden  im  Rahmen
  695. einer  Diplomarbeit  mit  einem  Aufwand von 6 Mannmonaten durchgefuehrt.  Das
  696. Programm ist stabil und hat bereits mehr als 100.000 Zeilen  Modula-2  nach  C
  697. uebersetzt.
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.                                                                             10
  725.  
  726.  
  727.  
  728. _________________________________________________________________________________
  729.  Phase               Spezifikation        Quell-Modul            Werkzeug
  730. _________________________________________________________________________________
  731.                   formal  Code  Summe  Def.  Impl.  Summe  Name  Referenzen
  732. _________________________________________________________________________________
  733.  Lex. Analyse       392    133   525     56   1320   1376  Rex   [Gro87a, Gro88]
  734.  Zerteiler          951     88  1039     81   3007   3088  Ell   [GrV88, Gro88]
  735.  Syntaxbaum         189     51   240    579   2992   3571  Ast   [Gro89d]
  736.  Symboltabelle      115    938  1053    413   1475   1888  Ast   [Gro89d]
  737.  Sem. Analyse      1886    151  2037      9   3288   3297  Ag    [Gro89c]
  738.  Codegenerator     2793    969  3762     47   7309   7356  Estra [Vie89]
  739.  Wiederverw.        -      -      -     819   2722   3541  Reuse [Gro87b]
  740.  Sonstiges          -      -      -     698   3153   3851
  741. _________________________________________________________________________________
  742.  Summe             6326   2330  8656   2702  25266  27968
  743. _________________________________________________________________________________
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.                 
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.                                      
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.                                                          
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.                                                                                 
  793.  
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  
  800.  
  801.  
  802.  
  803.  
  804.  
  805.  
  806.       Tabelle 1: Umfang der Spezifikationen und der Quellmodule von Mtc
  807.  
  808.  
  809.      Die Groesze des Binaerprogramms betraegt 300  K  Bytes.   Es  laeuft  mit
  810. einer  Geschwindigkeit  von  810  Grundsymbolen  (tokens) pro Sekunde oder 167
  811. Zeilen pro Sekunde auf einem SUN/3 Arbeitsplatzrechner (MC  68020  Prozessor).
  812. Diese  Zahlen  beruecksichtigen  nur die Groesze der uebersetzten Module. Wenn
  813. man zusaetzlich  die  (transitiv)  importierten  Definitionsmodule  beruecksi-
  814. chtigt,  die ebenfalls lexikalisch, syntaktisch und semantisch analysiert wer-
  815. den, so erreicht man  1320  Grundsymbole  pro  Sekunde  oder  418  Zeilen  pro
  816. Sekunde.   Zum  Vergleich  die  Zahlen  fuer  zwei  Uebersetzer  des  Rechner-
  817. Herstellers: Der C-Uebersetzer laeuft mit einer Geschwindigkeit von 97  Zeilen
  818. pro  Sekunde  (ohne  Header-Dateien)  bzw. 163 Zeilen pro Sekunde (mit Header-
  819. Dateien) und der Modula-2-Uebersetzer mit 48 Zeilen pro Sekunde. Die  Laufzeit
  820. von Mtc ist folgendermaszen verteilt:
  821.  
  822.  
  823.                      lex. + syn. Analyse + Baumaufbau   42 %
  824.                      semantische Analyse                33 %
  825.                      C Codegenerierung                  25 %
  826.  
  827.  
  828. Die semantische Analyse verbringt 95% der Zeit mit der Berechnung von Attribu-
  829. ten  mittels vom Benutzer spezifizierten Anweisungen und nur 5% fuer die Baum-
  830. traversierung bzw.  fuer  Besuchsaktionen.  Fuer  11  Knotentypen  sind  fuenf
  831. Besuche notwendig.
  832.  
  833.      Mtc  braucht  ungefaehr  360  K  Bytes  dynamischen  Speicher  pro   1000
  834. Quellzeilen  zur Speicherung des abstrakten Syntaxbaums, der Attribute und der
  835. Symboltabelle ohne Optimierung der Attributspeicherung. Weitere  600  K  Bytes
  836. benoetigt  der  von  Estra generierte Transformator. Dies ist bei den heutigen
  837. Speicherkapazitaeten ertraeglich.  Es zeigt, dasz im Gegensatz zu der  in  der
  838. Literatur  vertretenen  Meinung  moeglich  ist,  alle  Attribute  im  Baum  zu
  839. speichern. Wir tun dies sogar mit dem sogenannten Umgebungsattribut. Dies wird
  840. moeglich,  indem  wir  die  Symboltabelle als abstrakten Datentyp in der Ziel-
  841. sprache programmieren. Die Implementierung  ist  zeit-  und  speichereffizient
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.                                                                             11
  853.  
  854.  
  855. durch die Ausnutzung von Zeigersemantik und structure sharing.
  856.  
  857. 6.2.  Codegenerator fuer Modula-2-Uebersetzer
  858.  
  859.      In einer anderen Anwendung wurde der urspruenglich handgeschriebene Code-
  860. generator des GMD Modula-2-Uebersetzers Mocka durch zwei mit Beg erzeugte Ver-
  861. sionen ersetzt. Die Zielmaschine war ein MC 68020 Prozessor. Die Spezifikation
  862. des  Codegenerators  umfaszt  1625  Zeilen  und  enthaelt  187  Regeln  und 99
  863. Zwischensprach-Operatoren.  Zum  Vergleich   der   Qualitaet   des   erzeugten
  864. Maschinencodes  haben  wir  die  Laufzeiten  fuer eine Sammlung von Benchmark-
  865. Programmen gemessen (siehe Tabelle 2).  Dabei  ist  Mocka  der  GMD  Modula-2-
  866. Uebersetzer mit handgeschriebenem Codegenerator, Begra und Begfly sind die mit
  867. Beg erzeugten Versionen mit dem allgemeinen bzw. mit dem on the fly  Register-
  868. zuteiler,  und  Sun  der SUN Modula-2-Uebersetzer Version 1.0. Im Durchschnitt
  869. ist der Code von mit Beg erzeugten Codegeneratoren genau so gut, wie  der  des
  870. handgeschriebenen Codegenerators.
  871.  
  872.      Tabelle 3 vergleicht die Uebersetzungszeiten fuer ein 1116 Zeilen  langes
  873. Programm.  Alle  Messungen  wurden  auf  einer  SUN  3/60  durchgefuehrt,  die
  874. gemessenen Zeiten waren user Zeiten. Die Groesze des Codegenerators  nahm  von
  875. 5140  Zeilen  (17,117 Grundsymbole) fuer die handgeschriebene Version auf 9574
  876. Zeilen (27,044 Grundsymbole) zu.
  877.  
  878. 7.  Zusammenfassung und Ausblick
  879.  
  880.      Wir haben einen Werkzeugkasten mit Uebersetzerbau-Werkzeugen vorgestellt,
  881. womit sich Uebersetzer fuer Programmiersprachen weitgehend automatisch generi-
  882. eren lassen.   Die  Uebersetzerbau-Werkzeuge  unterstuetzen  die  Konstruktion
  883. nahezu  aller  Uebersetzerphasen.   Die Werkzeuge sind sehr maechtig, flexibel
  884. und weitgehend unabhaengig von einander.   Besonders  hervorzuheben  sind  die
  885.  
  886.  
  887. ______________________________________________________________________________________________
  888.           Perm   Towers   Queens   Intmm   Mm    Puzzle   Quick   Tree   Bubble   FFT   Summe
  889. ______________________________________________________________________________________________
  890.  Mocka     40      58       37      53     103    285      32      72      56     152    888
  891.  Begra     42      57       35      54     104    297      32      58      56     153    888
  892.  Begfly    42      57       34      54     102    299      33      56      56     151    884
  893.  Sun       67      90       28      83     101    263      41      81      63     150    967
  894. ______________________________________________________________________________________________
  895.  
  896.  
  897.  
  898.  
  899.  
  900.        
  901.  
  902.  
  903.  
  904.  
  905.               
  906.  
  907.  
  908.  
  909.  
  910.                        
  911.  
  912.  
  913.  
  914.  
  915.                                 
  916.  
  917.  
  918.  
  919.  
  920.                                         
  921.  
  922.  
  923.  
  924.  
  925.                                               
  926.  
  927.  
  928.  
  929.  
  930.                                                        
  931.  
  932.  
  933.  
  934.  
  935.                                                                
  936.  
  937.  
  938.  
  939.  
  940.                                                                       
  941.  
  942.  
  943.  
  944.  
  945.                                                                                
  946.  
  947.  
  948.  
  949.  
  950.                                                                                      
  951.  
  952.  
  953.  
  954.  
  955.                                                                                              
  956.  
  957.  
  958.  
  959.  
  960.  
  961.  
  962.  
  963.    Tabelle 2: Vergleich der Codequalitaet (Laufzeiten in ticks = 1/60 Sek.)
  964.  
  965.  
  966.                                _______________
  967.                                 Mocka     2.9
  968.                                 Begfly    3.2
  969.                                 Begra     3.9
  970.                                 Sun      25.4
  971.                                _______________
  972.                               
  973.  
  974.  
  975.                                       
  976.  
  977.  
  978.                                              
  979.  
  980.  
  981.  
  982.  
  983.  
  984.             Tabelle 3: Vergleich der Uebersetzungszeiten (in Sek.)
  985.  
  986.  
  987.  
  988.  
  989.  
  990.  
  991.  
  992.  
  993.  
  994.  
  995.  
  996.                                                                             12
  997.  
  998.  
  999. praktische Brauchbarkeit der Werkzeuge, der  deutlich  reduzierte  Erstellung-
  1000. saufwand  fuer Uebersetzer und die hohe Qualitaet der generierten Uebersetzer.
  1001. Von der Effizienz her sind die Werkzeuge konkurrenzfaehig  zur  Programmierung
  1002. von  Hand.   Sie unterstuetzen einen breiten Bereich von Uebersetzerstrukturen
  1003. und erlauben  die  Konstruktion  von  Uebersetzern  mit  Produktionsqualitaet.
  1004. Erste  realistische  Anwendungen zeigen die ausgezeichnete Leistungsfaehigkeit
  1005. der Werkzeuge.
  1006.  
  1007.      Die Uebersetzerbau-Werkzeuge eignen sich fuer  viele  Aufgabenstellungen,
  1008. die  ueber die Konstruktion von reinen Uebersetzern hinausgehen. Sie gestatten
  1009. beispielsweise   die   Implementierung   von   Praeprozessoren,   die    Spra-
  1010. cherweiterungen  und  Sprachdialekte  auf Standardsprachen abbilden. Wie eines
  1011. unserer  Anwendungsbeispiele  zeigte,   lassen   sich   Umsetzer   von   einer
  1012. Quellsprache  in eine andere erstellen. Weiterhin ist etwa die Generierung von
  1013. Pruefprogrammen fuer Programmierkonventionen moeglich.
  1014.  
  1015.      Die Optimierung der Attributspeicherung des Werkzeugs Ag werden wir  ver-
  1016. bessern,  damit Attribute gegebenenfalls auch als globale Variable und globale
  1017. Keller implementiert werden koennen.  Auszerdem sollte die Transformation  von
  1018. Grammatiken,  die  nicht  die  OAG-Eigenschaft  besitzen,  in  OAG-Grammatiken
  1019. automatisiert werden.
  1020.  
  1021.      Fuer  das  Werkzeug  Estra  ist  ein  Redesign  geplant.  Die  Spezifika-
  1022. tionssprache  laeszt  sich  vereinfachen, und die Integration des Werkzeug mit
  1023. Ast kann verbessert werden. Die  Effizienz  der  generierten  Transformations-
  1024. Module   laeszt  sich  sowohl  hinsichtlich  Laufzeit  als  auch  hinsichtlich
  1025. Speicherverbrauch verbessern.
  1026.  
  1027.      Die Optimierungsphase eines Uebersetzers sollte selbstverstaendlich  auch
  1028. unterstuetzt  werden.  Dies kann entweder durch einen wiederverwendbaren spra-
  1029. chunabhaengigen Optimierer, durch einen  parameterisierbaren  Optimierer  oder
  1030. durch einen Optimierergenerator geschehen.
  1031.  
  1032.      Das Werkzeug Beg wird in folgende Richtungen  erweitert  werden:  Generi-
  1033. erung  eines  globalen  Registerzuteilers, Unterstuetzung der Befehlsumordnung
  1034. (instruction scheduling) und einer Einrichtung zur  direkten  Generierung  von
  1035. binaerem Objektcode.
  1036.  
  1037. Danksagung
  1038.  
  1039.      Wir danken allen die zur Entstehung des Werkeugkastens  und  dieses  Auf-
  1040. satzes durch aktive Mitarbeit oder durch ihre Ideen beigetragen haben: Michael
  1041. Besser, Carsten Gerlhof, Bob Gray, Eduard  Klein,  Rudolf  Landwehr,  Matthias
  1042. Martin,  Thomas  Mueller,  F. W. Schroeer, Dirk Schwartz-Hertzner, Doris Viel-
  1043. sack, Bertram Vielsack und William M. Waite.
  1044.  
  1045. Literatur
  1046.  
  1047. [ASU86]
  1048.      A. V. Aho, R. Sethi and J. D. Ullman, Compilers: Principles,  Techniques,
  1049.      and Tools, Addison Wesley, Reading, MA, 1986.
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061.                                                                             13
  1062.  
  1063.  
  1064. [DeP82]
  1065.      F. DeRemer and T. Pennello, Efficient Computation of  LALR(1)  Look-Ahead
  1066.      Sets, ACM Trans. Prog. Lang. and Systems 4, 4 (Oct. 1982), 615-649.
  1067.  
  1068. [Emm88]
  1069.      H.  Emmelmann,  Automatische   Erzeugung   effizienter   Codegeneratoren,
  1070.      Diplomarbeit,  GMD  Forschungsstelle  an  der Universitat Karlsruhe, Sep.
  1071.      1988.
  1072.  
  1073. [ESL89]
  1074.      H. Emmelmann, F. W. Schroer and  R.  Landwehr,  BEG  -  a  Generator  for
  1075.      Efficient Back Ends, SIGPLAN Notices 24, 7 (July 1989), 227-237.
  1076.  
  1077. [Emm89a]
  1078.      H. Emmelmann, Automatische Erzeugung  effizienter  Codegeneratoren,  GMD-
  1079.      Studie Nr. 158, GMD Forschungsstelle an der Universitat Karlsruhe, 1989.
  1080.  
  1081. [Emm89b]
  1082.      H. Emmelmann, BEG - A Back End Generator - User Manual, Arbeitspapier Nr.
  1083.      420, GMD Forschungsstelle an der Universitat Karlsruhe, Dec. 1989.
  1084.  
  1085. [Gro87a]
  1086.      J. Grosch, Rex - A Scanner Generator, Compiler Generation Report  No.  5,
  1087.      GMD Forschungsstelle an der Universitat Karlsruhe, Dec. 1987.
  1088.  
  1089. [Gro87b]
  1090.      J. Grosch, Reusable Software - A Collection of  Modula-Modules,  Compiler
  1091.      Generation   Report  No.  4,  GMD  Forschungsstelle  an  der  Universitat
  1092.      Karlsruhe, Sep. 1987.
  1093.  
  1094. [GrV88]
  1095.      J. Grosch and B. Vielsack, The Parser Generators Lalr and  Ell,  Compiler
  1096.      Generation   Report  No.  8,  GMD  Forschungsstelle  an  der  Universitat
  1097.      Karlsruhe, Apr. 1988.
  1098.  
  1099. [Gro88]
  1100.      J. Grosch, Generators for High-Speed Front-Ends, LNCS 371,  (Oct.  1988),
  1101.      81-92, Springer Verlag.
  1102.  
  1103. [Gro89a]
  1104.      J. Grosch, Efficient Generation of Lexical Analysers, Software-Practice &
  1105.      Experience 19, 11 (Nov. 1989), 1089-1103.
  1106.  
  1107. [Gro89b]
  1108.      J. Grosch, Efficient and Comfortable Error Recovery in Recursive  Descent
  1109.      Parsers,  Compiler  Generation Report No. 19, GMD Forschungsstelle an der
  1110.      Universitat Karlsruhe, Dec. 1989.
  1111.  
  1112. [Gro89c]
  1113.      J. Grosch, Ag - An Attribute  Evaluator  Generator,  Compiler  Generation
  1114.      Report  No.  16,  GMD Forschungsstelle an der Universitat Karlsruhe, Aug.
  1115.      1989.
  1116.  
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.                                                                             14
  1127.  
  1128.  
  1129. [Gro89d]
  1130.      J. Grosch, Ast - A Generator for Abstract Syntax Trees (Revised Version),
  1131.      Compiler   Generation   Report   No.  15,  GMD  Forschungsstelle  an  der
  1132.      Universitat Karlsruhe, Aug. 1989.
  1133.  
  1134. [Gro89e]
  1135.      J. Grosch, Tool Support for Data Structures, Compiler  Generation  Report
  1136.      No. 17, GMD Forschungsstelle an der Universitat Karlsruhe, Nov. 1989.
  1137.  
  1138. [Gro90]
  1139.      J. Grosch, Object-Oriented Attribute  Grammars,  in  Proceedings  of  the
  1140.      Fifth International Symposium on Computer and Information Sciences (ISCIS
  1141.      V), A. E. Harmanci and E. Gelenbe (ed.),  Cappadocia,  Nevsehir,  Turkey,
  1142.      Oct. 1990, 807-816.
  1143.  
  1144. [Joh75]
  1145.      S. C. Johnson, Yacc -  Yet Another  Compiler-Compiler,  Computer  Science
  1146.      Technical  Report  32, Bell Telephone Laboratories, Murray Hill, NJ, July
  1147.      1975.
  1148.  
  1149. [Kas80]
  1150.      U. Kastens, Ordered Attribute Grammars, Acta Inf. 13, 3 (1980), 229-256.
  1151.  
  1152. [Les75]
  1153.      M. E. Lesk,  LEX  -  A  Lexical  Analyzer  Generator,  Computing  Science
  1154.      Technical Report 39, Bell Telephone Laboratories, Murray Hill, NJ, 1975.
  1155.  
  1156. [Mar90]
  1157.      M. Martin, Entwurf und Implementierung  eines  Ubersetzers  von  Modula-2
  1158.      nach  C, Diplomarbeit, GMD Forschungsstelle an der Universitat Karlsruhe,
  1159.      Feb. 1990.
  1160.  
  1161. [Roeh76]
  1162.      J.  Rohrich,  Syntax-Error  Recovery  in   LR-Parsers,   in   Informatik-
  1163.      Fachberichte, vol. 1, H.-J. Schneider and M. Nagl (ed.), Springer Verlag,
  1164.      Berlin, 1976, 175-184.
  1165.  
  1166. [Roeh80]
  1167.      J. Rohrich, Methods for the Automatic Construction  of  Error  Correcting
  1168.      Parsers, Acta Inf. 13, 2 (1980), 115-139.
  1169.  
  1170. [Roeh82]
  1171.      J. Rohrich, Behandlung syntaktischer Fehler,  Informatik  Spektrum  5,  3
  1172.      (1982), 171-184.
  1173.  
  1174. [Vie89]
  1175.      B.  Vielsack,  Spezifikation  und  Implementierung   der   Transformation
  1176.      attributierter   Baume,   Diplomarbeit,   GMD   Forschungsstelle  an  der
  1177.      Universitat Karlsruhe, June 1989.
  1178.  
  1179. [VSK89]
  1180.      H. H. Vogt, S. D. Swierstra and M.  F.  Kuiper,  Higher  Order  Attribute
  1181.      Grammars, SIGPLAN Notices 24, 7 (July 1989), 131-145.
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.                                                                              1
  1193.  
  1194.  
  1195. Inhalt
  1196.  
  1197.         Uebersicht ......................................................    1
  1198. 1.      Aufbau eines Uebersetzers .......................................    1
  1199. 2.      Werkzeugkasten ..................................................    2
  1200. 3.      Gemeinsame Eigenschaften ........................................    3
  1201. 4.      Uebersetzer-Modell ..............................................    4
  1202. 5.      Die Werkzeuge ...................................................    4
  1203. 5.1.    Rex .............................................................    5
  1204. 5.2.    Lalr ............................................................    5
  1205. 5.3.    Ell .............................................................    6
  1206. 5.4.    Ast .............................................................    6
  1207. 5.5.    Ag ..............................................................    6
  1208. 5.6.    Estra ...........................................................    7
  1209. 5.7.    Beg .............................................................    8
  1210. 5.8.    Reuse ...........................................................    8
  1211. 6.      Erfahrungen .....................................................    9
  1212. 6.1.    Modula nach C Uebersetzer .......................................    9
  1213. 6.2.    Codegenerator fuer Modula-2-Uebersetzer .........................   11
  1214. 7.      Zusammenfassung und Ausblick ....................................   11
  1215.         Danksagung ......................................................   12
  1216.         Literatur .......................................................   12
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230.  
  1231.  
  1232.  
  1233.  
  1234.  
  1235.  
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.